package 基础语法.反射;

import java.lang.reflect.Field;

/**
 * 
 * 从 Java 9 开始，JVM 引入了 模块化系统（Java Platform Module System, JPMS），其目标之一是增强安全性与封装性。
 * 
 * String 类属于 java.base 模块；
 * 默认情况下，java.base 模块 不对外开放内部字段的反射访问；
 * 即使你调用 setAccessible(true)，JVM 也会阻止你访问 private 字段，如 private final byte[] value；
 * 运行时添加参数：
 * --add-opens java.base/java.lang=ALL-UNNAMED
 * & 'D:\JAVA-jdk\jdk17.0.5\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '--add-opens' 'java.base/java.lang=ALL-UNNAMED' '-cp' 'C:\Users\ASUS\AppData\Roaming\Code\User\workspaceStorage\a77e198924ec54d7ceb3f6066aeeb74e\redhat.java\jdt_ws\Java语法与工具学习_d9dd67d5\bin' '基础语法.包.反射'
 */
public class 反射String {
    public static void main(String[] args) throws Exception {// java --add-opens java.base/java.lang=ALL-UNNAMED -cp .
                                                             // 基础语法.包.反射
        String s = "aaaa";
        System.out.println("修改前: " + s);

        // 获取 String 类的 value 字段
        Class<?> stringClass = s.getClass();
        Field valueField = stringClass.getDeclaredField("value");

        // 打破访问限制（private）
        valueField.setAccessible(true);

        // 获取当前 value 数组
        byte[] originalValue = (byte[]) valueField.get(s);
        System.out.println("原始 value 长度: " + originalValue.length);

        // 创建新字节数组（例如改成 "bbbb"）
        byte[] newValue = "bbbb".getBytes(java.nio.charset.StandardCharsets.UTF_8);

        // 修改 final 字段（虽然 final，但反射仍可修改引用）
        valueField.set(s, newValue);

        System.out.println("修改后: " + s); // 输出 bbbb

    }

}
